#include <stdio.h>
#include <stdlib.h>

#include "tool.h"

int sdb_init(const char* path, sdb* sptr){
    sqlite3* db;
    int ret = sqlite3_open(path,&db);
    if (ret == 0){
        sptr->db = db;
    }
    return ret;
}

int sdb_close(sdb* sptr){
    int ret = sqlite3_close(sptr->db);
    free(sptr);
    return ret;
}

static int callback(void *data, int argc, char **argv, char **azColName){
    for(int i=0; i<argc; i++){
        printf("%i: %s=%s",argc, azColName[i],  argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int sdb_exec(sdb* ptr, const char* sql){
    char* msg = NULL;
    int ret = sqlite3_exec(ptr->db, sql, callback, 0, &msg);
    if (ret != 0){
        printf("exec_err: %s\n", msg);
    }
    return ret;
}

sdb_rows* sdb_query(sdb* ptr, const char* sql){
    char* msg = NULL;
    sdb_rows* rows = malloc(sizeof(sdb_rows));
    rows->result = NULL;
    rows->col = 0;
    rows->row = 0;
    int ret = sqlite3_get_table(ptr->db, sql, &rows->result, &rows->row, &rows->col, &msg);
    if (ret != 0) {
        printf("query_err: %s\n", msg);
    }
    return rows;
}

void free_sdb_rows(sdb_rows* rows){
    sqlite3_free_table(rows->result);
    free(rows);
}

// static int callback_test(void *data, int argc, char **argv, char **azColName){
//    int i;
//    fprintf(stderr, "%s: ", (const char*)data);
//    for(i=0; i<argc; i++){
//       printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
//    }
//    printf("\n");
//    return 0;
// }

// int main(){

//     sqlite3* ptr;
//     int ret = sqlite3_open("demo.db",&ptr);
//     printf("open:%i\n",ret);

//     // char* msg1 = NULL;
//     // char *sql1 = "insert into user(Id,Name)"\
//     //     "values(3,'zz')";
//     // ret = sqlite3_exec(ptr, sql1, callback_test, 0, &msg1);
//     // printf("exec: %i\n", ret);

//     char *sql = "select * from user";
//     char* msg = NULL;
//     // ret =  sqlite3_exec(ptr, sql, callback, 0, &msg);
//     char** pResult;
//     int nRow = 0;
//     int nCol = 0;
//     ret = sqlite3_get_table(ptr, sql, &pResult, &nRow, &nCol, &msg);
//     printf("ret: %i = %i:%i\n", ret, nRow, nCol);

//     int idx = nCol;
//     for(int i=0; i<nRow; i++){
//         for(int j=0; j<nCol; j++){
//             printf("%s=%s,",pResult[j], pResult[idx]);
//             idx++;
//         }
//         printf("\n");
//     }
//     ret = sqlite3_close(ptr);
//     printf("close: %i\n",ret);
// }

// gcc tool.c sqlite3-binding.c -fPIC -shared -o libtool.so
// gcc sqlite3-binding.c -fPIC -shared -o libsqlite3.so